El intérprete de comandos (Shell)
Como ya es conocido, el intérprete de comandos es el encargado de tomar la línea brindada por el usuario e interpretarla, procediendo a ejecutar el programa correspondiente.
Cada usuario puede hacer uso de in intérprete de comando diferente. La identificación del que será utilizado se encuentra señalado en la línea correspondiente al usuario en el fichero de contraseña. La mayoría de los usuarios hacen uso del intérprete de comandos estándar conocido como shell.
Para el shell la primera palabra que aparece en la línea corresponde al nombre del programa a ejecutar. A continuación lo busca y si aparece crea un hijo que se encarga de su ejecución. Normalmente el shell se suspende a sí mismo hasta que el hijo termina.
Los comandos pueden tener argumentos, los que se transfieren como cadenas de caracteres al programa llamado.
Ejemplo:
cp fuente destino
Hay argumentos que tienen como objetivo controlar la operación de un comando o determinar un valor especial. A estos se le denomina banderas u se utilizan en convenio de anteponerles un guión.
Ejemplo:
head -20 fichero (imprimir las 20 primeras líneas del fichero).
Se utilizan comodines en los comandos con el mismo sentido que se usan en MD-DOS.
* sustituye cualquier cadena.
? sustituye cualquier carácter.
Ejemplo:
ls *.C (lista todos los ficheros cuyos nombre finalizan en .C).
Los programas del shell se inicializan con tres ficheros abiertos.
? La entrada estándar (normalmente proviene del teclado).
? La salida estándar (Normalmente a la pantalla).
? Error estándar (Normalmente a la pantalla).
Ejemplo:
sort (Lectura hasta Crtl-D, ordena y escribe en pantalla).
La entrada y salida estándar se pueden redireccionar. La entrada se redirecciona mediante el signo menor ().
Ejemplo:
sort < entrada > salida (los mensajes de error seguirían hasta la pantalla).
Un programa que lea su entrada de la entrada estándar, la procesa y explica sus resultados en la salida estándar se nombra un filtro.
Cuando la salida de un programa constituye la entrada a otro, no se requiere que el intercambio se realice por medio de un fichero, en ese caso se puede hacer uso de una tubería la que se indica mediante una barra vertical.
Ejemplo:
sort < entrada | head – 30 (imprime las 30 primeras líneas del fichero entrada previo ordenamiento).
Los entubamientos se realizan en UNIX mediante la utilización de un área de memoria.
En UNIX es posible colocar una lista de comandos del shell en un fichero y después iniciar un segundo shell con este archivo como entrada estándar. El segundo shell los procesaría en orden, de la misma forma que se haría con comandos tecleados desde el teclado.
Los archivos que contienen comandos del shell se llaman guiones del shell. Estos pueden contener variables, parámetros e instrucciones if, for while, case.
Ejemplo:
sh < fichero.
Si al entrar un usuario a trabajar con el sistema, en su directorio se encuentra un guión del shell con nombre profile, este se procesa automáticamente.
Comandos del sistema
Como ya es conocido, los comandos del sistema permiten a los usuarios poner en ejecución los programas del sistema, que aquí reciben el nombre de utilerías.
El UNIX dispone de una enorme cantidad de utilerías y resulta imposible describirlas todas aquí, por ello solo se hará referencia a los de uso más frecuente. Resulta conveniente aclarar que existen algunos de estos programas del sistema que están presentes en todas las versiones, pero otros tienen un carácter particular.
En general, los programas del sistema se pueden clasificar en:
1. Comandos para el manejo de archivos y directorios.
2. Filtros.
3. Compiladores y herramientas para el desarrollo de programas.
4. Procesamiento de texto.
5. Administración del sistema.
6. Varios.
Veamos primeramente algunos de los comandos existentes para el manejo de ficheros y directorios. En algunos casos se especificarán algunas banderas.
1. cat (concatena ficheros y escribe el resultado en la salida estándar)
Ejemplos:
? cat fich1
? cat fich1 fich2
? cat fich1 fich2 > fich3
? cat > fich1
Nota: Donde se indica fich podría ser una trayectoria completa
Ejemplo:
? cd sub1
? cd /usr/sub1
? cd
? cd..
3. chmod (modifica la modificación de protección del fichero).
Ejemplo:
? chmod g-x fich1
? chmod o+r fich2
4. cp (copia el fichero en otro o varios ficheros en un directorio)
Ejemplo:
? cp fich1 fich2
? cp fich1 fich2 dir
5. find (encuentra todos los ficheros que cumplen con una determinada condición)
Ejemplo:
? find -name ´sec?´ -print
? find /user -user ´jose´ – print
6. ln (permite crear un enlace con un fichero)
Ejemplo:
? ln /usr/juan/este ese
? ln /usr/juan/este/ese
? ln este ese (crea un sinónimo).
7. ls (permite listar los contenidos de un directorio)
Forma general
ls [-ltasdru] dir …
L utilizar el formato largo
T listar en el orden de la última modificación
A listar todas las entradas (incluyendo las invisibles).
S reporte el tamaño en bloques (igual a 512 bytes).
D reporte información de estado del directorio.
R listar en orden inverso
U listar en el orden del último acceso.
Ejemplo:
? ls
? ls /usr/jose (por defecto la lista es en orden alfabético)
Otros comandos de este grupo serían:
8. comm (Imprime líneas comunes a dos ficheros ordenados).
9. diff (imprime las diferencias entre dos ficheros).
10. lpr (envía un fichero a la cola del demonio de impresión).
11. __b0mkdir (crea un directorio).
12. mv (mueve o cambia de nombre a un fichero).
13. pr (da formato a un fichero para su impresión).
14. rm (permite eliminar un fichero o al menos un enlace).rmdir (permite eliminar un subdirectorio).
15. head (imprime las primeras líneas de uno o más ficheros).
16. tail (imprime las últimas líneas de uno o mas ficheros).
17. cmp (compara dos ficheros para ver si son idénticos).
18. pwd (imprime el directorio de trabajo).
19. crypt (permite encriptar y desencriptar ficheros).
Algunos de los comandos antes mencionados, como es el case de cat, operan como filtros. De igual forma otros se podrán catalogar como de procesamiento de texto, etc. Un comando importante de este grupo es el sort que permite ordenar.
Ejemplo:
sort < ../fichero
Ejemplos de comandos relacionados con los compiladores y herramientas para el desarrollo de aplicaciones están:
1. cc (compila un programa en C).
2. make (permite trabajar una aplicación como un proyecto, lo que implica la compilación automática de todo lo afectado por un cambio).
Comandos para el procesamiento de texto se podrían considerar:
1. ed (editor de textos orientado a líneas).
2. grep (busca en un fichero las líneas que tienen cierto patrón).
3. gres (igual al anterior pero las sustituye).
4. spell (búsqueda de errores en un texto).
5. uniq (elimina las líneas consecutivas iguales de un fichero).
6. wc (cuenta los caracteres, palabras y líneas pertenecientes un fichero).
Algunos de los restantes posibles comandos de un sistema UNIX serían los siguientes:
1. passwd (permite cambiar la palabra clave de un usuario).
2. kill (permite eliminar un proceso que corre en fondo).
3. sleep (suspende la ejecución de un proceso durante una cantidad de segundos).
4. date (muestra la fecha y la hora).
5. du (brinda información sobre espacio ocupado en el disco).
7. pwd (muestra la trayectoria del directorio de trabajo).
8. who (brinda información acerca de los usuarios trabajando en el sistema).
9. bc (una calculadora programable).
10. sh (pone en ejecución una copia del shell).
Para un adecuado uso del sistema operativo se requiere disponer del manual de usuario de la versión disponible, a los efectos de conocer los comandos existentes y la sintaxis requerida.
Llamadas al sistema
Para completar la visión acerca de este sistema operativo resulta conveniente hacer una breve revisión de las llamadas al sistema que pueden ser utilizadas por los programas.
En primer lugar, hagamos referencia a las llamadas al sistema para la administración de los procesos.
1. pid = fork() crea un proceso hijo.
2. s=waitpid(pid, &status, opts) espera a que termine un hijo.
3. s=execve(name, argv, envp) sustituye la imagen central de un proceso.
4. exit(status) termina la ejecución y regresa el estado).
5. s=kill(pid, sig) envía una señal a un proceso.
6. residual=alarm(seconds) solicita una señal sigalarm después de los segundos indicados.
7. pause() suspende el proceso hasta esperar una señal.
Otro grupo de uso frecuente por los programadores es el referente al uso de ficheros y directorios.
1. fd=creat(name, mode) crear un fichero nuevo.
2. fd=open(file, how) abrir un fichero.
3. s=close(fd) cerrar un fichero abierto.
4. n=read(fd, buffer, nbytes) lee n bytes.
5. n=write(fd, buffer, nbytes) escribir n bytes.
6. pos=lseek(fd, offset, whence) mover el apuntador del fichero.
7. s=mkdir(name, mode) crea un nuevo directorio.
8. s=rmdir(name) elimina un directorio vacío.
9. s=link(name1, name2) crea un enlace a un fichero.
10. s=unlink(name) elimina una entrada del directorio.
11. s=shdir(dirname) cambia el directorio de trabajo.
12. s=chmod(name, mode) cambia los bits de protección de un fichero.
Por supuesto que existen otros grupos de llamadas al sistema, por ejemplo las relacionadas con la manipulación de la memoria y las referentes a la entrada y salida.
Sistema de ficheros
La raíz del directorio de UNIX es creado en la carga del sistema y al surgir ya tiene predefinido un conjunto de subdirectorios (por ejemplo, creado en un disco RAM). Normalmente los subdirectorios que aparecen son:
1. /bin Contiene los binarios de los programas del sistema.
2. /dev Contiene los archivos especiales que modelan los dispositivos de I/O.
3. /etc Contiene ficheros y programas de administración del sistema (por ejemplo, fichero de contraseñas).
4. /lib Contiene las bibliotecas.
5. /tmp Contiene ficheros temporales. Algunas utilirías colocan aquí información de esta índole.
6. /user Normalmente contiene un subdirectorio por usuario con palabra clave en el sistema (la trayectoria de cada uno aparece en la entrada correspondiente del fichero de contraseñas y cuando un usuario entra al sistema se le coloca allí como directorio corriente o actual).
7. /usr Contendrá otros subdirectorios y si la versión correspondiente no tiene el /user, entonces los directorios de los usuarios se crean aquí.
Otro subdirectorio que aparecería en la raíz es el que contiene los procedimientos binarios de carga del sistema (pudiera llamarse /vmunix).
Algunos de los subdirectorios contenidos en /usr serían:
1. /usr/adm Contiene ficheros con contabilidad de uso del sistema.
2. /usr/bin Contiene los binarios de otros programas del sistema (Por ejemplo, para dar formato a un texto).
3. /usr/lib Contiene otras bibliotecas.
4. /usr/man Contiene ficheros con los manuales del sistema.
5. /usr/spool Contiene directorios para el spooling de impresión y otros demonios.
6. /usr/tmp Contiene también otros ficheros temporales. Se supone estos ficheros sean borrados diariamente, al igual que en el caso de /tmp.
Como ya se indicó, el directorio /dev contiene los ficheros especiales que modelan los dispositivos. Algunos de los que pueden aparecer son:
1) /dev/mem Memoria absoluta.
2) /dev/console Consola de control.
3) /dev/null Dispositivo nulo.
4) /dev/fd (0 n) Torres de discos flexibles.
5) /dev/lp (0 n) Impresoras.
6) /dev/tty (0 n) Terminales de usuarios.
Normalmente los usuarios y sus programas no hacen uso de estos ficheros, para estas operatorias hacen uso de los programas del sistema y de las llamadas al sistema. La utilización de estos ficheros resulta frecuentemente peligrosa.
La estrategia de UNIX cuando se requiere hacer uso de ficheros y directorios que se encuentran en soportes diferentes consiste en montar los sistemas de ficheros en un árbol único.
Para entender este aspecto suponga que se tiene un disco duro y un disco flexible conteniendo los sistemas de ficheros que se muestran:
y se desea copiar el archivo X hacia el directorio d.
La alternativa es montar el disco flexible en un subdirectorio del otro árbol, digamos b. Si b no esta vacío, entonces los ficheros y subdirectorios que se encuentran en éste se vuelven inaccesibles, ya que pasará a ser la raíz del árbol que se incorporará.
El comando a utilizar con este objetivo será el mount en una forma aproximada a la siguiente:
/etc/mount /dev/fd1 /b
Torre de disco flexible 1
lo anterior provocará que el árbol quedará como:
Ahora la copia sería tan sencilla como plantear el comando:
cp /b/x /a/d/x
Para desmontar un sistema de ficheros se hace uso del comando umount. Por ejemplo, en el caso anterior se plantearía:
etc/umount /dev/fd1
Bibliografía
Sistemas Operativos Modernos, Tenembaun A.S, Prentice Hall Hispanoamerica S.A, pag 299 – 355.
A User Guide to the UNIX System.
Autor:
Maikel J. Menéndez
Página anterior | Volver al principio del trabajo | Página siguiente |